package com.liuyjy.base.mybatisplus.util;

import com.liuyjy.base.mybatisplus.config.MybatisPlusConfig;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

/**
 * @Author liuyjy
 * @Date 2022/3/1 9:43
 * @Description: 表名工具
 **/
public class TableNameUtil {


    private static ConcurrentMap<String, Map<String, Integer>> modMap = new ConcurrentHashMap<>();


    private static ConcurrentMap<String, Set<String>> valTableNameMap = new ConcurrentHashMap<>();


    /**
     * 获取表名map
     *
     * @return String
     */
    public static Set<String> getValTableNameMap() {
        if (!valTableNameMap.containsKey(MybatisPlusConfig.appName)) {
            throw new RuntimeException("请设置分表信息！");
        }
        return valTableNameMap.get(MybatisPlusConfig.appName);
    }

    /**
     * 缓存配置信息
     *
     * @param modTable 表名
     */
    public static void setValTable(String modTable) {
        Set<String> list = null;
        if (valTableNameMap.containsKey(MybatisPlusConfig.appName)) {
            list = valTableNameMap.get(MybatisPlusConfig.appName);
        } else {
            list = new HashSet<>();
        }
        list.add(modTable);

        valTableNameMap.put(MybatisPlusConfig.appName, list);
    }

    /**
     * 缓存配置信息
     *
     * @param modTable 表名
     */
    public static void setMod(String modTable, Integer mod) {
        Map<String, Integer> map = null;
        if (modMap.containsKey(MybatisPlusConfig.appName)) {
            map = modMap.get(MybatisPlusConfig.appName);
        } else {
            map = new HashMap<>();
        }
        map.put(modTable, mod);

        modMap.put(MybatisPlusConfig.appName, map);
    }


    /**
     * 获取表名map
     *
     * @return String
     */
    public static Map<String, Integer> getModTableNameMap() {
        if (!modMap.containsKey(MybatisPlusConfig.appName)) {
            throw new RuntimeException("请设置分表信息！");
        }
        return modMap.get(MybatisPlusConfig.appName);
    }


    /**
     * 获取表名
     *
     * @param modObj 求模对象
     * @return String
     */
    public static String getModTableName(Long modObj, String modTable) {
        Integer mod = getModTableSuffix(modObj, modTable);
        return modTable + "_" + Math.toIntExact(modObj % mod);
    }

    /**
     * 获取表下标
     *
     * @param modObj 求模对象
     * @return String
     */
    public static Integer getModTableSuffix(Long modObj, String modTable) {
        if (null == modObj) {
            return null;
        }
        if (!modMap.containsKey(MybatisPlusConfig.appName)) {
            throw new RuntimeException("请设置分表信息！");
        }
        Map<String, Integer> map = modMap.get(MybatisPlusConfig.appName);
        Integer mod = map.get(modTable);
        return Math.toIntExact(modObj % mod);
    }


}
